/**
 * Copyright 2009-2015 the original author or authors.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.ibatis.datasource;

import javax.sql.DataSource;
import java.util.Properties;

/**
 * MyBatis使用不同的DataSourceFactory接口创建不同类型的DataSource
 * 这是工厂方法模式的一个典型应用。
 * 工厂方法模式定义了一个创建对象的工厂接口，并根据工厂接口的具体是实例化哪一个具体产品类
 * <p>
 * <p>
 * ﻿工厂方法模式四个角色构成:
 * ﻿(1)﻿工厂接口（Factory）：工厂接口是工厂方法模式的核心接口，调用者会直接与工厂接口交互用户获取具体的产品实现类；
 * ﻿(2)具体工厂类（ConcreteFactory）：具体工厂类是工厂接口的实现类，用于实例化产品对象，不同的具体工厂类会根据
 * 需求实例化不同的产品实现类；
 * ﻿(3)产品接口（Product）：产品接口用于定义产品类的功能，具体工厂类产生的所有产品对象都必须实例化该接口。
 * 调用者一般会面向产品接口进行编程，所有产品接口会与调用者直接交互，活着也是调用者最为关心的接口；
 * ﻿(4)具体产品类（ConcreteProduct）：实现产品接口的实现类，具体产品类中定义了具体的业务逻辑；
 * <p>
 * <p>
 * 这里可以看出在datasource包下的职责划分为：
 * ﻿(1)DataSourceFactory是工厂接口；
 * (2)PooledDataSourceFactory、UnpooledDataSourceFactory以及JndiDataSourceFactory是具体工厂类实现了工厂接口；
 * (3)javax.sql.DataSource是产品接口；
 * (4)PooledDataSource和UnpooledDataSource是具体产品类实现了产品接口;
 * <p>
 * <p>
 * 当有新的数据源模块需要进行添加的时候，只需要添加对应的工厂实现类（具体工厂类（ConcreteFactory））即可，而不用修改其他代码
 * @author Clinton Begin
 */
public interface DataSourceFactory {

    /**
     * 设置DataSource的相关属性，一般紧跟在初始化完成之后
     * @param props 属性参数
     */
    void setProperties(Properties props);

    /**
     * 获取DataSource对象
     */
    DataSource getDataSource();

}
